/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Programas;

import java.sql.Timestamp;
import java.util.ArrayList;

/**
 *
 * @author Heitor
 */
public class Processo {

    private static ArrayList dados;
    private int idProcesso, groupId, tempoDeChegada, tempoDeExecucao, quantum;
    private int prioridade, tamanho, timestemp, count, pag, segInicio;
    private Timestamp InstUltUso;
    private String estado;

    public static ArrayList getDados() {
        return dados;
    }

    public int getPag() {
        return pag;
    }

    public void setPag(int pag) {
        this.pag = pag;
    }

    public int getSegInicio() {
        return segInicio;
    }

    public void setSegInicio(int segInicio) {
        this.segInicio = segInicio;
    }

    public static void setDados(ArrayList dados) {
        Processo.dados = dados;
    }

    public int getIdProcesso() {
        return idProcesso;
    }

    public void setIdProcesso(int idProcesso) {
        this.idProcesso = idProcesso;
    }

    public int getGroupId() {
        return groupId;
    }

    public void setGroupId(int groupId) {
        this.groupId = groupId;
    }

    public int getTempoDeChegada() {
        return tempoDeChegada;
    }

    public void setTempoDeChegada(int tempoDeChegada) {
        this.tempoDeChegada = tempoDeChegada;
    }

    public int getTempoDeExecucao() {
        return tempoDeExecucao;
    }

    public void setTempoDeExecucao(int tempoDeExecucao) {
        this.tempoDeExecucao = tempoDeExecucao;
    }

    public int getQuantum() {
        return quantum;
    }

    public void setQuantum(int quantum) {
        this.quantum = quantum;
    }

    public int getPrioridade() {
        return prioridade;
    }

    public void setPrioridade(int prioridade) {
        this.prioridade = prioridade;
    }

    public int getTamanho() {
        return tamanho;
    }

    public void setTamanho(int tamanho) {
        this.tamanho = tamanho;
    }

    public int getTimestemp() {
        return timestemp;
    }

    public void setTimestemp(int timestemp) {
        this.timestemp = timestemp;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public String getEstado() {
        return estado;
    }

    private void setEstado(String estado) {
        this.estado = estado;
    }

    public boolean isReferenciado() {
        return referenciado;
    }

    public void setReferenciado(boolean referenciado) {
        this.referenciado = referenciado;
    }

    public boolean isModificado() {
        return modificado;
    }

    public void setModificado(boolean modificado) {
        this.modificado = modificado;
    }

    public boolean[] getAging() {
        return aging;
    }

    public void setAging(boolean[] aging) {
        this.aging = aging;
    }

    public ArrayList<ThreadClass> getSupervisor() {
        return supervisor;
    }

    public void setSupervisor(ArrayList<ThreadClass> supervisor) {
        this.supervisor = supervisor;
    }
    private boolean referenciado, modificado;
    private boolean aging[] = {false, false, false, false, false, false, false, false};
    private ArrayList<ThreadClass> supervisor;

    @SuppressWarnings("empty-statement")
    public Processo(int tempoDeChegada, int tempoDeExecucao, int quantum, int prioridade, int tamanho) {
        this.idProcesso = CriarProcesso.numProcesso;
        this.groupId = CriarProcesso.groupId;
        this.tempoDeChegada = tempoDeChegada;
        this.tempoDeExecucao = tempoDeExecucao;
        this.quantum = quantum;
        this.prioridade = prioridade;
        this.tamanho = tamanho;
        timestemp = 0;
        estado = "pronto";
        referenciado = false;
        modificado = false;
        count = 0;
        supervisor = new ArrayList<ThreadClass>();
        int quant = random(10)+1;
        while (quant > 0) {
            supervisor.add(new ThreadClass(random(10)+1, random(10)+1, random(200)+1));
            CriarProcesso.numThread++;
            quant--;
        }
    }

    public Processo() {
        idProcesso = 0;
        groupId = 0;
        tempoDeChegada = 0;
        tempoDeExecucao = 0;
        quantum = 0;
        prioridade = 0;
        tamanho = 0;
        timestemp = 0;
        estado = "pronto";
        referenciado = false;
        modificado = false;
        count = 0;
        supervisor = new ArrayList<ThreadClass>();
        InstUltUso =  new Timestamp(System.currentTimeMillis());
    }

    private int random(int maximo) {//Gera numeros aleatórios
        Double random = Math.random() * 100;
        return (random.intValue() % maximo);
    }

    public void mudarEstado(String novoEstado) {//Modifica o estado do prcesso
        if (estado.equals("bloqueado")) {
            estado = "pronto";
        } else if (estado.equals("pronto")) {
            estado = novoEstado;
        } else if (estado.equals("executando")) {
            estado = novoEstado;
        }
    }

    /**
     * @return the InstUltUso
     */
    public Timestamp getInstUltUso() {
        return InstUltUso;
    }

    /**
     * @param InstUltUso the InstUltUso to set
     */
    public void setInstUltUso(Timestamp InstUltUso) {
        this.InstUltUso = InstUltUso;
    }

    public void referenciaAging(boolean isR) {
        for (int i = 7; i < 0; i--) {
            aging[i] = aging[i - 1];
        }
        aging[0] = isR;
    }
}
